package util;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 使用连接池的方式获取redis连接
 */
public class JedisPoolUtil {

    /*
        volatile作用
        1.保证线程可见性：当一个线程去修改一个共享变量时，另外一个线程可以读取到这个修改的值
        2.顺序的一致性：禁止指令重排
     */
    private static volatile JedisPool jedisPool = null;

    private JedisPoolUtil() {

    }

    //保证每次调用返回的JedisPool是单例的
    public static JedisPool getJedisPoolInstance() {
        if (null == jedisPool) {
            synchronized (JedisPoolUtil.class) {
                //这里使用了单例模式的双重校验，防止高并发时其余请求再次执行sync块代码
                if (null == jedisPool) {
                    //对JedisPool进行配置
                    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
                    //设置最大连接数200
                    jedisPoolConfig.setMaxTotal(400);
                    //设置最大空闲连接数32
                    jedisPoolConfig.setMaxIdle(32);
                    //设置最大等待时间60s
                    jedisPoolConfig.setMaxWaitMillis(60 * 1000);
                    jedisPoolConfig.setBlockWhenExhausted(true);
                    jedisPoolConfig.setTestOnBorrow(true);
                    jedisPool = new JedisPool(jedisPoolConfig, "192.168.45.128", 6379, 60 * 1000, "lmy");
                }
            }
        }
        return jedisPool;
    }

    //释放连接资源
    public static void release(Jedis jedis) {
        //如果这个jedis是从连接池获取的，这里jedis.close()就是将jedis连接释放回连接池
        if (null != jedis) {
            jedis.close();
        }
    }

}
